home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / c / koch.lha / Schneeflocke / SCHNEEFLOCKE.C < prev   
C/C++ Source or Header  |  2001-07-28  |  2KB  |  101 lines

  1. /*  Kochsche Schneeflocke                                                                       */
  2. /*  Norman Walter, Universität Stuttgart                                       */
  3. /*  http://www.norman-interactive.com                                       */
  4. /*  e-mail: walternn@rupert.informatik.uni-stuttgart.de   */
  5.  
  6. #include <stdio.h>
  7. #include <time.h>
  8. #include <math.h>
  9. #include <GL/glut.h>
  10.  
  11. void malen(void);
  12. void draw_lines(float X0, float Y0, float X1, float Y1);
  13.  
  14. int main(int argc, char **argv)
  15. {
  16.   glutInit(&argc, argv);
  17.  
  18.   glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
  19.  
  20.   glutInitWindowSize(400,300);
  21.   glutInitWindowPosition(100,100);
  22.   glutCreateWindow("Kochsche Schneeflocke");
  23.   glClearColor(0.0, 0.0, 0.0, 0.0);
  24.   glMatrixMode(GL_PROJECTION);
  25.   glLoadIdentity();
  26.   glOrtho(-200.0, 600.0, -150.0, 450.0, -1.0, 1.0);
  27.   glutDisplayFunc(&malen);
  28.  
  29.   glutMainLoop();
  30.   return(0);
  31. }
  32.  
  33. void malen(void)
  34. {
  35.   /* Koordinaten für drei Punkte */
  36.  
  37.   float P1X = 0.0;
  38.   float P1Y = 0.0;
  39.  
  40.   float P2X = 200;
  41.   float P2Y = 200*sqrt(3.0);
  42.  
  43.   float P3X = 400.0;
  44.   float P3Y = 0.0;
  45.  
  46.   glClear(GL_COLOR_BUFFER_BIT);
  47.  
  48.   /* Hier wird die Funktion draw_lines aufgerufen */
  49.   /* Eingabefolge : X0, Y0, X1, Y1                */
  50.  
  51.   /* Wir zeichnen ein gleichseitiges Dreieck */
  52.  
  53.   draw_lines(P1X,P1Y,P2X,P2Y);
  54.   draw_lines(P2X,P2Y,P3X,P3Y);
  55.   draw_lines(P3X,P3Y,P1X,P1Y);
  56.  
  57.   glFlush();
  58.  
  59. }
  60.  
  61.  
  62. void draw_lines(float X0, float Y0, float X1, float Y1)
  63. {
  64.   float AX = X0;
  65.   float AY = Y0;
  66.  
  67.   float BX = (2.0*X0+X1)/3.0;
  68.   float BY = (2.0*Y0+Y1)/3.0;
  69.  
  70.   float CX = (X0+X1)/2.0 - sqrt(3.0)/6.0*(Y1-Y0);
  71.   float CY = (Y0+Y1)/2.0 + sqrt(3.0)/6.0*(X1-X0);
  72.  
  73.   float DX = (X0+2.0*X1)/3.0;
  74.   float DY = (Y0+2.0*Y1)/3.0;
  75.  
  76.   float EX = X1;
  77.   float EY = Y1;
  78.  
  79.  
  80.   /* Es werden nur Linien der Länge < 4 gezeichnet */ 
  81.   if (pow(X0-X1,2)+pow(Y0-Y1,2)<4.0)
  82.   {
  83.     glBegin(GL_LINES);
  84.     glColor3f(1.0,1.0,1.0);
  85.     glVertex2f(X0,Y0);
  86.     glVertex2f(X1,Y1);
  87.     glEnd();
  88.   }
  89.  
  90.   else
  91.  
  92.   {
  93.     /* Rekursive Funktionsaufrufe */
  94.     draw_lines(AX,AY,BX,BY); // Linie von a nach b
  95.     draw_lines(BX,BY,CX,CY); // Linie von b nach c
  96.     draw_lines(CX,CY,DX,DY); // Linie von c nach d
  97.     draw_lines(DX,DY,EX,EY); // Linie von d nach e 
  98.   }
  99.  
  100. }
  101.